using System;
using System.Collections.Generic;
using System.Text;

namespace Ndo.Maths
{
    #region Non-Generic Interfaces
    public interface IAddition
    {
        object Add(object addend);
    }
    public interface ISubtraction
    {
        object SubtractedFrom(object subtrahend);
    }
    public interface IMultiply
    {
        object MultipliedBy(object multiplicator);
    }
    public interface IDivision
    {
        object DividedBy(object divisor);
    }
    public interface IArithmetic : IAddition, ISubtraction, IMultiply, IDivision
    { }
    public interface IModulus
    {
        object Modulus(object divisor);
    }
    #endregion
    
    #region Arithmetics Interfaces
    public interface IAddition<TFinal>
        where TFinal : Object<TFinal>, IAddition<TFinal>
    {
        TFinal Add(TFinal addend);
    }
    public interface ISubtraction<TFinal>
        where TFinal : Object<TFinal>, ISubtraction<TFinal>
    {
        TFinal SubtractedFrom(TFinal subtrahend);
    }
    public interface IMultiply<TFinal>
        where TFinal : Object<TFinal>, IMultiply<TFinal>
    {
        TFinal MultipliedBy(TFinal multiplicator);
    }
    public interface IDivision<TFinal>
        where TFinal : Object<TFinal>, IDivision<TFinal>
    {
        TFinal DividedBy(TFinal divisor);
    }
    public interface IArithmetic<TFinal> : IArithmetic, IAddition<TFinal>, ISubtraction<TFinal>, IMultiply<TFinal>, IDivision<TFinal>, IEquatable<TFinal>
        where TFinal : Object<TFinal>, IArithmetic<TFinal>
    { }
    #endregion
    public interface ISign
    {
        SignTypes Sign { get; }
    }
    public interface IModulus<TFinal>
        where TFinal : Object<TFinal>
    {
        TFinal Modulus(TFinal divisor);
    }
    public interface IPlus<TFinal>
        where TFinal : Object<TFinal>
    {
        TFinal GetPlus();
    }
    public interface INegation<TFinal>
        where TFinal : Object<TFinal>
    {
        TFinal GetNegation();
    }
    public interface IIncrement<TFinal>
        where TFinal : Object<TFinal>
    {
        TFinal GetIncrement();
    }
    public interface IDecrement<TFinal>
        where TFinal : Object<TFinal>
    {
        TFinal GetDecrement();
    }

}
